package cn.csc.module.order.service.addr;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.module.order.controller.admin.addr.vo.OrderAddrCreateReqVO;
import cn.csc.module.order.controller.admin.addr.vo.OrderAddrExportReqVO;
import cn.csc.module.order.controller.admin.addr.vo.OrderAddrPageReqVO;
import cn.csc.module.order.controller.admin.addr.vo.OrderAddrUpdateReqVO;
import cn.csc.module.order.controller.admin.order.vo.OrderUpdateDeliveryReqVO;
import cn.csc.module.order.dal.dataobject.addr.OrderAddrDO;

import javax.validation.Valid;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;

/**
 * 用户订单配送地址 Service 接口
 *
 * @author liuchuang
 */
public interface OrderAddrService {

    /**
     * 创建用户订单配送地址
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    BigInteger createAddr(@Valid OrderAddrCreateReqVO createReqVO);

    /**
     * 更新用户订单配送地址
     *
     * @param updateReqVO 更新信息
     */
    void updateAddr(@Valid OrderAddrUpdateReqVO updateReqVO);

    /**
     * 删除用户订单配送地址
     *
     * @param id 编号
     */
    void deleteAddr(BigInteger id);

    /**
     * 获得用户订单配送地址
     *
     * @param id 编号
     * @return 用户订单配送地址
     */
    OrderAddrDO getAddr(BigInteger id);

    /**
     * 获得用户订单配送地址列表
     *
     * @param ids 编号
     * @return 用户订单配送地址列表
     */
    List<OrderAddrDO> getAddrList(Collection<BigInteger> ids);

    /**
     * 获得用户订单配送地址分页
     *
     * @param pageReqVO 分页查询
     * @return 用户订单配送地址分页
     */
    PageResult<OrderAddrDO> getAddrPage(OrderAddrPageReqVO pageReqVO);

    /**
     * 获得用户订单配送地址列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 用户订单配送地址列表
     */
    List<OrderAddrDO> getAddrList(OrderAddrExportReqVO exportReqVO);
    /**
     * 获得用户订单配送地址 根据订单id
     *
     * @param orderId 编号
     * @return 用户订单配送地址
     */
    OrderAddrDO getAddrByOrderId(BigInteger orderId);
    /**
     * 获得用户订单配送地址的物流订单号 根据订单id。itemid
     *
     * @param orderId 编号
     * @param orderItemId 编号
     * @return 用户订单配送地址
     */
    OrderAddrDO getLogistics(BigInteger orderId,BigInteger orderItemId);

    /**
     * 更新订单地址项
     *
     * @param updateReqVO 更新信息
     */
    void updateBatch(List<OrderAddrUpdateReqVO> updateReqVO);
}
